/*
 *  Copyright (C) 2005-2007 Renier Roth
 *  www.renier.de
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public License
 *  as published by the Free Software Foundation; either version 2
 *  of the License, or any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
package de.renier.jkeepass.renderer;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;

import javax.swing.Icon;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;

import de.renier.jkeepass.components.JSortTable;

/**
 * SortHeaderRenderer
 *
 * @author <a href="mailto:software@renier.de">Renier Roth</a>
 */
public class SortHeaderRenderer extends DefaultTableCellRenderer {

  private static final long serialVersionUID = 7608567424901512204L;
  public static Icon NONSORTED = new SortArrowIcon(SortArrowIcon.NONE);
  public static Icon ASCENDING = new SortArrowIcon(SortArrowIcon.ASCENDING);
  public static Icon DECENDING = new SortArrowIcon(SortArrowIcon.DECENDING);

  public SortHeaderRenderer() {
    setHorizontalTextPosition(LEFT);
    setHorizontalAlignment(CENTER);
  }

  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
      int row, int col) {
    int index = -1;
    boolean ascending = true;
    if (table instanceof JSortTable) {
      JSortTable sortTable = (JSortTable) table;
      index = sortTable.getSortedColumnIndex();
      ascending = sortTable.isSortedColumnAscending();
    }
    if (table != null) {
      JTableHeader header = table.getTableHeader();
      if (header != null) {
        setForeground(header.getForeground());
        setBackground(header.getBackground());
        setFont(header.getFont());
      }
    }
    Icon icon = ascending ? ASCENDING : DECENDING;
    setIcon(col == index ? icon : NONSORTED);
    setText((value == null) ? "" : value.toString());
    setBorder(UIManager.getBorder("TableHeader.cellBorder"));
    return this;
  }
  
  /**
   * SortArrowIcon
   */
  private static class SortArrowIcon implements Icon {
    public static final int NONE = 0;
    public static final int DECENDING = 1;
    public static final int ASCENDING = 2;

    protected int direction;
    protected int width = 8;
    protected int height = 8;

    public SortArrowIcon(int direction) {
      this.direction = direction;
    }

    public int getIconWidth() {
      return width;
    }

    public int getIconHeight() {
      return height;
    }

    public void paintIcon(Component c, Graphics g, int x, int y) {
      Color bg = c.getBackground();
      Color light = bg.brighter();
      Color shade = bg.darker();

      int w = width;
      int h = height;
      int m = w / 2;
      if (direction == ASCENDING) {
        g.setColor(shade);
        g.drawLine(x, y, x + w, y);
        g.drawLine(x, y, x + m, y + h);
        g.setColor(light);
        g.drawLine(x + w, y, x + m, y + h);
      }
      if (direction == DECENDING) {
        g.setColor(shade);
        g.drawLine(x + m, y, x, y + h);
        g.setColor(light);
        g.drawLine(x, y + h, x + w, y + h);
        g.drawLine(x + m, y, x + w, y + h);
      }
    }
  }
}
